﻿#region Header
// Copyright 2007-2011, Jerónimo Milea
// 
// This file is part of NetJsWire.
// 
//     NetJsWire is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as published by
//     the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
// 
//     NetJsWire is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
// 
//     You should have received a copy of the GNU General Public License
//     along with NetJsWire.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Xml;
using NetJsWire.JsonRpcHandler;
using NetJsWire.JsonRpcHandler.Attributes;
using Newtonsoft.Json;
using Formatting = Newtonsoft.Json.Formatting;

namespace NetJsWire.Widgets.Renderers.Data
{
    [ClassName( "Ext.data.ArrayStore" )]
    internal class ArrayStore : Store
    {
        private XmlNode _columnsNode;

        public ArrayStore( object baseObject )
            : base( baseObject )
        {
        }

        public override void Render()
        {
            if ( !Rendered )
            {
                if ( Base.ConfigOptions.Proxy != null )
                {
                    ShouldRenderData = false;
                    SetConstructionProperty( "proxy", "new Ext.data.DirectProxy(" + JsonConvert.SerializeObject( Base.ConfigOptions.Proxy, Formatting.None ) + ")" );
                }
            }
            base.Render();
        }

        protected override void RenderColumns()
        {
            if ( Base.DataSource != null && Base.DataSource is Type )
            {
                if ( ControlNode[ "columns" ] == null )
                    _columnsNode = ControlNode.AppendChild( WebApplication.Instance.XmlDocument.CreateNode( XmlNodeType.Element, "columns", "" ) );
                else
                    _columnsNode.RemoveAll();

                // NOTE: Type is gonna be most of the time the DataSource because if its a DirectStore we don't need to set data in server...)
                var props = ( ( Type ) Base.DataSource ).GetProperties();
                foreach ( var prop in props )
                {
                    if ( !prop.IsSpecialName && prop.Name != "ExtensionData" )
                    {
                        var colNode = _columnsNode.AppendChild( WebApplication.Instance.XmlDocument.CreateNode( "element", "column", "" ) );
                        colNode.InnerText = prop.Name;
                    }
                }
            }
            else
            {
                base.RenderColumns();
            }
        }
    }
}
